Skip to main content

zap 日志 使用封装

package common

import (
"fmt"
"os"
"strings"
"time"

"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)

var levelMap = map[string]zapcore.Level{
"debug": zapcore.DebugLevel,
"info": zapcore.InfoLevel,
"warn": zapcore.WarnLevel,
"error": zapcore.ErrorLevel,
"dpanic": zapcore.DPanicLevel,
"panic": zapcore.PanicLevel,
"fatal": zapcore.FatalLevel,
}

func getLoggerLevel(lvl string) zapcore.Level {
if level, ok := levelMap[lvl]; ok {
return level
}
return zapcore.InfoLevel
}

var pool = map[string]*ZLog{}

var NLog *ZLog

type ZLog struct {
Logger *zap.Logger
// error logger
sugaredLogger *zap.SugaredLogger

Hook lumberjack.Logger
}

func NewLogWithName(name, path string, level string, format string) *ZLog {
// 仅打印Error级别以上的日志
highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= getLoggerLevel(strings.ToLower(level))

})
// 打印所有级别的日志
lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.DebugLevel
})
if path == "" {
path = "../log/common/all-logs.log"
}
if name == "" {
name = "common"
}
path += ".zlog"
hook := lumberjack.Logger{
Filename: path, // 日志文件路径
MaxSize: 10, // megabytes
MaxBackups: 2, // 最多保留3个备份
MaxAge: 30, //days
Compress: true, // 是否压缩 disabled by default
}
fileWriter := zapcore.AddSync(&hook)

consoleDebugging := zapcore.Lock(os.Stdout)

encoderConfig := zap.NewDevelopmentEncoderConfig()
encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format("2006-01-02 15:04:05"))
} //zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder //按级别显示不同颜色,
//encoderConfig.EncodeCaller = zapcore.FullCallerEncoder //显示完整文件路径
encoderConfig.CallerKey = "caller"
encoderConfig.TimeKey = "time"
encoderConfig.LevelKey = "level"
encoderConfig.MessageKey = "msg"
encoderConfig.LineEnding = zapcore.DefaultLineEnding

consoleEncoder := zapcore.NewConsoleEncoder(encoderConfig)
fileConfig := zap.NewProductionEncoderConfig()
fileConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format("2006-01-02 15:04:05"))
}

var fileEncoder zapcore.Encoder
switch strings.ToLower(format) {
case "test":
fileEncoder = zapcore.NewConsoleEncoder(fileConfig)
default:
fileEncoder = zapcore.NewJSONEncoder(fileConfig)
}

var core zapcore.Core
if getLoggerLevel(strings.ToLower(level)) >= zapcore.ErrorLevel {
core = zapcore.NewTee(
// 打印在文件中
zapcore.NewCore(fileEncoder, fileWriter, highPriority),
)
} else {

core = zapcore.NewTee(
// 打印在控制台
zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority),
// 打印在文件中
zapcore.NewCore(fileEncoder, fileWriter, highPriority),
)
}
// 设置初始化字段
filed := zap.Fields(zap.String("serviceName", name))
nlogger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1), zap.Development(), zap.AddStacktrace(zapcore.WarnLevel), filed)

NLog = &ZLog{
Logger: nlogger,
sugaredLogger: nlogger.Sugar(),
Hook: hook,
}

pool[name] = NLog

return NLog

}

func NewLog(path string, level string, format string) *ZLog {
return NewLogWithName("common", path, level, format)
}

func LogWithName(name string) *ZLog {
if log, ok := pool[name]; ok {
return log
}
if log, ok := pool["common"]; ok {
return log
}
return NLog
}

func (z *ZLog) Aync() {
z.sugaredLogger.Sync()
fmt.Println("aync")
z.Hook.Rotate()
}

func (z *ZLog) Debug(args ...interface{}) {
z.sugaredLogger.Debug(args)
}

func (z *ZLog) Debugf(template string, args ...interface{}) {
z.sugaredLogger.Debugf(template, args...)
}

func (z *ZLog) Info(args ...interface{}) {
z.sugaredLogger.Info(args...)
}
func (z *ZLog) Infow(msg string, args ...interface{}) {
z.sugaredLogger.Infow(msg, args...)
}

func (z *ZLog) Infof(template string, args ...interface{}) {
z.sugaredLogger.Infof(template, args...)
}

func (z *ZLog) Warn(args ...interface{}) {
z.sugaredLogger.Warn(args...)
}

func (z *ZLog) Warnf(template string, args ...interface{}) {
z.sugaredLogger.Warnf(template, args...)
}

func (z *ZLog) Error(args ...interface{}) {
z.sugaredLogger.Error(args...)
}

func (z *ZLog) Errorf(template string, args ...interface{}) {
z.sugaredLogger.Errorf(template, args...)
}

func (z *ZLog) DPanic(args ...interface{}) {
z.sugaredLogger.DPanic(args...)
}

func (z *ZLog) DPanicf(template string, args ...interface{}) {
z.sugaredLogger.DPanicf(template, args...)
}

func (z *ZLog) Panic(args ...interface{}) {
z.sugaredLogger.Panic(args...)
}

func (z *ZLog) Panicf(template string, args ...interface{}) {
z.sugaredLogger.Panicf(template, args...)
}

func (z *ZLog) Fatal(args ...interface{}) {
z.sugaredLogger.Fatal(args...)
}

func (z *ZLog) Fatalf(template string, args ...interface{}) {
z.sugaredLogger.Fatalf(template, args...)
}